package br.com.datasun.biblioteca.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;


import br.com.datasun.biblioteca.dao.factory.ConnectionFactory;
import br.com.datasun.biblioteca.entities.Cidade;
import br.com.datasun.biblioteca.entities.Endereco;
import br.com.datasun.biblioteca.entities.Estado;
import br.com.datasun.biblioteca.exceptions.DAOException;

public class EnderecoDAO {
	
				
	public Endereco getEnderecoByID(Long idEndereco) throws DAOException{
		Endereco endereco = null;		
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		ResultSet resultSet   = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT e.id ");
		sql.append("       ,e.nm_logradouro ");
		sql.append("       ,e.numero ");
		sql.append("       ,e.cep ");
		sql.append("       ,e.nm_bairro ");
		sql.append("       ,e.complemento ");
		sql.append("       ,e.id_cidade ");
		sql.append("       ,c.nome nome_cidade ");
        sql.append("       ,c.id_estado ");
        sql.append("       ,uf.sigla ");
        sql.append("       ,uf.nome nome_estado");
		sql.append("   FROM endereco e ");
		sql.append("  inner join cidade c on (c.id = e.id_cidade) ");
        sql.append("  inner join estado uf on (uf.id = c.id_estado)");
		sql.append("  WHERE e.id = ? ");
		
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setLong(1, idEndereco);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				endereco = new Endereco();
				endereco.setId(resultSet.getLong("id"));
				endereco.setNmLogradouro(resultSet.getString("nm_logradouro"));
				endereco.setNumero(resultSet.getString("numero"));
				endereco.setCep(resultSet.getString("cep"));
				endereco.setBairro(resultSet.getString("nm_bairro"));
				endereco.setComplemento(resultSet.getString("complemento"));
				Estado estado = new Estado();
				estado.setId(resultSet.getLong("id_estado"));
				estado.setSigla(resultSet.getString("sigla"));
				estado.setNome(resultSet.getString("nome_estado"));
				Cidade cidade = new Cidade();
				cidade.setId(resultSet.getLong("id_cidade"));
				cidade.setNome(resultSet.getString("nome_cidade"));
				cidade.setEstado(estado);							
				endereco.setCidade(cidade);
			}
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		return endereco;
	}
	public boolean atualizarEndereco(Endereco endereco) throws DAOException{
		boolean result = false;
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" update endereco ");
		sql.append("    set nm_logradouro = ?");
		sql.append("       ,numero = ? ");
		sql.append("       ,cep = ? ");
		sql.append("       ,nm_bairro = ? ");
		sql.append("       ,complemento = ? ");
		sql.append("       ,id_cidade = ? ");
		sql.append(" where id = ?");
		
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setString(1, endereco.getNmLogradouro());
			preparedStatement.setString(2, endereco.getNumero());
			preparedStatement.setString(3, endereco.getCep());
			preparedStatement.setString(4, endereco.getBairro());
			preparedStatement.setString(5, endereco.getComplemento());
			Cidade cidade = null;
			cidade = endereco.getCidade();
			preparedStatement.setLong(6, cidade.getId());
			preparedStatement.setLong(7, endereco.getId());
			preparedStatement.executeUpdate();
			result = true;
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		return result;
	}

	public Endereco inserir(Endereco endereco) throws DAOException{
		Connection connection = null;
		PreparedStatement preparedStatement   = null;
		ResultSet resultSet = null;
		StringBuilder sql = new StringBuilder();
		sql.append(" insert into endereco (nm_logradouro, numero, cep, nm_bairro, complemento, id_cidade) VALUES(?,?,?,?,?,?)");
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);
			preparedStatement.setString(1, endereco.getNmLogradouro());
			preparedStatement.setString(2, endereco.getNumero());
			preparedStatement.setString(3, endereco.getCep());
			preparedStatement.setString(4, endereco.getBairro());
			preparedStatement.setString(5, endereco.getComplemento());
			Cidade cidade = null;
			cidade = endereco.getCidade();
			preparedStatement.setLong(6, cidade.getId());
			preparedStatement.execute();
			resultSet = preparedStatement.getGeneratedKeys();

			if(resultSet.next()){
				Long idGerado = resultSet.getLong(1);
				endereco.setId(idGerado);
			}
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(resultSet != null){
					resultSet.close();
				}
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		return endereco;
	}
	
	
	public boolean excluirEnderecoPorId(Long idEndereco) throws DAOException{
		boolean result = false;
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		StringBuilder sql = new StringBuilder();
		sql.append("delete from endereco ");
		sql.append(" where id= ?");
		try{
			connection = ConnectionFactory.createConnectionToMySQL();
			preparedStatement = connection.prepareStatement(sql.toString());
			preparedStatement.setLong(1, idEndereco);
			preparedStatement.execute();
			result = true;
		}catch (Exception e) {
			throw new DAOException(e);
		}finally{
			try{
				if(preparedStatement != null){
					preparedStatement.close();
				}
				if(connection != null){
					connection.close();
				}
			}catch (Exception e) {
				throw new DAOException(e);
			}
		}
		return result;
	}

}
